#include <stdio.h>
#include <math.h>

#define MAX_TRY 200  // 匹配 Python 的 MAX_TRY = 200

/**
 * 函数指针类型定义：对应 Python 的 f(x) 和 f'(x)
 * @param x: 自变量
 * @return: 函数值
 */
typedef double (*Func)(double);

/**
 * 牛顿-拉夫逊迭代法核心函数（对应 Python 的 newton_raphson 函数）
 * @param start: 迭代初始值
 * @param f: 目标函数指针（f(x)）
 * @param fp: 目标函数的导数指针（f'(x)）
 * @return: 方程 f(x)=0 的近似根
 */
double newton_raphson(double start, Func f, Func fp) {
    double x = start;

    for (int i = 0; i < MAX_TRY; i++) {
        double f_x = f(x);       // 计算 f(x)
        double fp_x = fp(x);     // 计算 f'(x)

        // 避免除以零（导数为 0 时无法迭代）
        if (fabs(fp_x) < 1e-15) {
            fprintf(stderr, "警告：导数为 0，迭代终止\n");
            break;
        }

        double x_next = x - f_x / fp_x;  // 牛顿迭代公式
        // 收敛判断：绝对误差小于 1e-12
        if (fabs(x_next - x) < 1e-12) {
            break;
        }
        x = x_next;
    }

    return x;
}

/**
 * 目标函数 f(x) = x² - 2（对应 Python 的 f(x)）
 */
double f(double x) {
    return x * x - 2.0;
}

/**
 * 目标函数的导数 f'(x) = 2x（对应 Python 的 fprime(x)）
 */
double fprime(double x) {
    return 2.0 * x;
}

int main() {
    // 调用牛顿-拉夫逊法，初始值 1.0，求解 f(x)=0 的根
    double sqrt2 = newton_raphson(1.0, f, fprime);
    // 标准库 sqrt(2) 作为对比
    double std_sqrt2 = sqrt(2.0);

    // 输出结果
    printf("%.15f %.15f\n", sqrt2, std_sqrt2);
    // 判断是否相等（双精度浮点直接判等，与 Python 逻辑一致）
    printf("%s\n", (sqrt2 == std_sqrt2) ? "True" : "False");

    return 0;
}